﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebApplication1.Classes;
using WebApplication1.WSMeioPagamentoBanco;
using WebApplication1.WSMeioPagamentoCartaoCredito;

namespace WebApplication1
{
    public class ParcelaJuros
    {
        public ParcelaJuros()
        {
            
        }

        public int NumeroParcelas { get; set; }
        public double Juros { get; set; }
        public string Nome { get; set; }
    }

	public partial class Pagamento : BaseRestrictedPage
    {
		protected override void Page_Load(object sender, EventArgs e)
        {
			base.Page_Load(sender, e);
            if (!this.IsPostBack)
            {
                this.CarregaTela();
                //this.valorTotal = Convert.ToDouble(Session["ValorTotal"]);
            }
        }

        private List<cartao> listaCartoes 
        {
            get { return (List<cartao>)ViewState["ListaCartoes"]; } 
            set { ViewState["ListaCartoes"] = value; }
        }

        //private double valorTotal = 0.0D;

        private void CarregaTela()
        {
            pnlDadosCartao.Visible = false;
            pnlDadosBanco.Visible = false;

            WSMeioPagamentoCartaoCredito.PagamentoCartaoImplService wsCartaoCredito = new PagamentoCartaoImplService();
            listaCartoes = wsCartaoCredito.listaCartoes().ToList();

        }

        private void CarregarListaBandeira()
        {
            listaCartoes.ForEach((a) => a.bandeira = a.bandeira + " - ( " + a.quantidade_max_parcelas + "x )");

            rblBandeiras.DataSource = listaCartoes;
            rblBandeiras.DataTextField = "bandeira";
            rblBandeiras.DataValueField = "bandeira";

            rblBandeiras.DataBind();
        }

        //private void RealizaPagamentoBanco()
        //{
        //    WSMeioPagamentoBanco.BancoServiceWeb bancoServiceWeb = new BancoServiceWeb();

            
        //    double valor = 0.0D;

        //    //Via Deposito
        //    int idPagamentoGerado = 0;
        //    bool boolPagamentoGerado = false;
        //    bancoServiceWeb.PagarViaDepositoBancario(agencia, true, conta, true, valor, true, out idPagamentoGerado, out boolPagamentoGerado);

        //    //Via Boleto
        //    bancoServiceWeb.PagarViaBoletoBancario(agencia, true, conta, true, valor, true, out idPagamentoGerado, out boolPagamentoGerado);

        //    //Via Transferencia Bancaria
        //    bancoServiceWeb.PagarViaTransferenciaBancaria(agencia, true, conta, true, valor, true, out idPagamentoGerado, out boolPagamentoGerado);

        //    //exemplos de verificar pagamento
        //    bancoServiceWeb.VerificaStatusPagamento(idPagamentoGerado, true);

        //    //cancelamento pagamento
        //    int? idCancelamentoPagamento = 0;
        //    bool boolCancelamentoPagamento = false;
        //    bancoServiceWeb.CancelarPagamento(idPagamentoGerado, true, out idCancelamentoPagamento, out boolCancelamentoPagamento);
        //}

        //private void RealizaPagamentoCartaoCredito()
        //{
        //    WSMeioPagamentoCartaoCredito.PagamentoCartaoImplService wsCartaoCredito = new PagamentoCartaoImplService();

        //    //dados necessários
        //    long valorCompra = 100;
            

        //    cartao[] listaCartoes = wsCartaoCredito.listaCartoes();
        //    string bandeiraSelecionada = listaCartoes[0].bandeira;

        //    wsCartaoCredito.validaCompra(valorCompra, nomeTitular, bandeiraSelecionada, numeroCartao, dataValidade,
        //                                codigoSeguranca, qtdeParcelas);
        //}


        private void PagamentoViaBanco()
        {
            int agencia = 0;
            int conta = 0;
            int idPagamentoGerado = 0;
            bool boolPagamentoGerado = false;

            agencia = Convert.ToInt32(txbAgencia.Text);
            conta = Convert.ToInt32(txbConta.Text);

            int i = Convert.ToInt32(rblMeioPagamento.SelectedValue);

            WSMeioPagamentoBanco.BancoServiceWeb bancoServiceWeb = new BancoServiceWeb();
            switch (i)
            {
                case 1:
                    bancoServiceWeb.PagarViaBoletoBancario(agencia, true, conta, true, Convert.ToDouble(Session["ValorTotal"]), true,
                                                           out idPagamentoGerado, out boolPagamentoGerado);
                    break;
                case 2:
                    bancoServiceWeb.PagarViaTransferenciaBancaria(agencia, true, conta, true, Convert.ToDouble(Session["ValorTotal"]), true,
                                                                  out idPagamentoGerado, out boolPagamentoGerado);
                    break;
                case 3:
                    bancoServiceWeb.PagarViaDepositoBancario(agencia, true, conta, true, Convert.ToDouble(Session["ValorTotal"]), true,
                                                             out idPagamentoGerado, out boolPagamentoGerado);
                    break;
                default:
                    break;
            }

            Usuario.PedidoAtual.idCliente = Usuario.Objeto.CPF;

            PedidoPagamento pedidoPagamento = new PedidoPagamento();
            pedidoPagamento.idTransacao = idPagamentoGerado;
            pedidoPagamento.statusCartaoCredito = int.MinValue;
            pedidoPagamento.tipoPagamento = 1; //pagamento via banco

            Usuario.PedidoAtual.Pagamento = pedidoPagamento;

            this.Finaliza();

        }

        private void PagamentoViaCartaoCredito()
        {
            string nomeTitular = string.Empty;
            string numeroCartao = string.Empty;
            string dataValidade = string.Empty;
            string codigoSeguranca = string.Empty;
            int qtdeParcelas = 0;

            nomeTitular = txbNomeTitular.Text;
            numeroCartao = txbNumeroCartao.Text;
            dataValidade = txbDataValidade.Text;
            codigoSeguranca = txbCodSeguranca.Text;
            qtdeParcelas = Convert.ToInt32(ddlNumeroParcelas.SelectedValue);

            long valorCompra = Convert.ToInt64(Convert.ToDouble(Session["ValorTotal"]));
            
            cartao cartaoSelecionado = listaCartoes.Find((a) => a.bandeira == rblBandeiras.SelectedValue);
            string bandeiraSelecionada = cartaoSelecionado.bandeira.Split('-')[0].Trim().ToUpper();

            try
            {
                WSMeioPagamentoCartaoCredito.PagamentoCartaoImplService wsCartaoCredito = new PagamentoCartaoImplService();
                bool resultadoTransacao = wsCartaoCredito.validaCompra(valorCompra, nomeTitular, bandeiraSelecionada, numeroCartao, dataValidade,
                                        codigoSeguranca, qtdeParcelas);

                Usuario.PedidoAtual.idCliente = Usuario.Objeto.CPF;

                PedidoPagamento pedidoPagamento = new PedidoPagamento();
                pedidoPagamento.idTransacao = int.MinValue;
                pedidoPagamento.statusCartaoCredito = Convert.ToInt32(resultadoTransacao);
                pedidoPagamento.tipoPagamento = 2; //pagamento via cartao credito

                Usuario.PedidoAtual.Pagamento = pedidoPagamento;

                this.Finaliza();
            }
            catch (Exception ex)
            {
                litErro.Text = ex.Message;
                //throw;
            }
           
        }

        private void Finaliza()
        {
            int totalPeso = Convert.ToInt32(Session["TotalPeso"]);
            double totalVolume = Convert.ToDouble(Session["TotalVolume"]);
            int modoEntrega = Convert.ToInt32(Session["Meio"]);

            WSLogistica.C06_LogisticaService LogisticaService = new WSLogistica.C06_LogisticaService();

            if (Convert.ToBoolean(ConfigurationManager.AppSettings["IsWifi"]))
                LogisticaService.Url = "http://localhost:8680/c06/services/C06_Logistica?wsdl";

            string cep = Usuario.CepEntrega.Replace("-", "");
            string[] retorno = LogisticaService.webserviceTransporte(totalPeso, totalVolume, Convert.ToInt32(cep), modoEntrega, 1);

            Usuario.PedidoAtual.codRastreamento = retorno[1];
            Usuario.PedidoAtual.valorPedido = Convert.ToDecimal(Convert.ToDouble(Session["ValorTotal"]));

            using (DataBase db = new DataBase())
            {
                db.SalvarPedidoCompleto(Usuario.PedidoAtual);
                Response.Redirect("~/Finaliza.aspx");

            }
            //retorno[1]
        }

        protected void btnPagamento_Click(object sender, EventArgs e)
        {
            int i = Convert.ToInt32(rblMeioPagamento.SelectedValue);

            switch (i)
            {
                case 1:
                case 2:
                case 3:
                    this.PagamentoViaBanco();
                    break;
                case 4:
                    this.PagamentoViaCartaoCredito();
                    break;
                default:
                    break;
            }
        }

        protected void rblBandeiras_SelectedIndexChanged(object sender, EventArgs e)
        {
            cartao cartaoSelecionado = listaCartoes.Find((a) => a.bandeira == rblBandeiras.SelectedValue);

            var listaParcelas = cartaoSelecionado.juros.ToList();
            List<ParcelaJuros> listaParcelaJuros = new List<ParcelaJuros>();

            listaParcelaJuros = listaParcelas.ConvertAll<ParcelaJuros>((a) => new ParcelaJuros()
                                                                                  {
                                                                                      Juros = a.juros,
                                                                                      Nome =
                                                                                          string.Format(
                                                                                              "{0} - (Juros: {1}%)",
                                                                                              a.numero.ToString(),
                                                                                              a.juros.ToString("0.00")),
                                                                                      NumeroParcelas = a.numero
                                                                                  });

            ddlNumeroParcelas.DataSource = listaParcelaJuros;
            ddlNumeroParcelas.DataTextField = "nome";
            ddlNumeroParcelas.DataValueField = "numeroParcelas";
            ddlNumeroParcelas.DataBind();

            //txbNumeroParcelas.Text = cartaoSelecionado.quantidade_max_parcelas.ToString();
        }

        protected void rblMeioPagamento_SelectedIndexChanged(object sender, EventArgs e)
        {
            int i = Convert.ToInt32(rblMeioPagamento.SelectedValue);

            switch (i)
            {
                case 1:
                case 2:
                case 3:
                    pnlDadosBanco.Visible = true;
                    pnlDadosCartao.Visible = false;
                    break;
                case 4:
                    pnlDadosCartao.Visible = true;
                    pnlDadosBanco.Visible = false;
                    this.CarregarListaBandeira();
                    break;
                default:
                    break;
            }

        }

    }
}